// 引入vue
import Vue from 'vue'
// 引入router
import router from '@/router'
// 引入axios请求库
import axios from 'axios';
// 该页面引入vant 轻弹窗 (响应拦截器需使用)
import {Toast} from 'vant'


// 设置基准路径
//axios.defaults.baseURL = 'http://157.122.54.189:9083/';
//axios.defaults.baseURL = 'http://liangwei.tech:3000';
axios.defaults.baseURL = 'http://127.0.0.1:3000';
//axios.defaults.headers.post['Content-Type'] = 'application/json';



// 路由守卫
// 全局前置路由守卫，会在所有路由发生变化之前进行拦截
// 调用 router 的 beforeEach 方法
// router.beforeEach() 拦截所有跳转，跳转之前都会执行一个函数，我们要作为参数传进去
router.beforeEach((to,from,next)=>{
    // //写法一 直接判断 to.name
    // if (to.name == 'personalPage' || to.name == 'editPage') {

    // // 另外一种写法，是将需要校验的路由封装在一个数组中
    // var pageNeedAuth = [
    //   'editPage',
    //   'personalPage'
    // ]
    // // 如果在这个数组中能够找到 to.name 就证明需要校验
    // if(pageNeedAuth.indexOf(to.name) >= 0) {
    // 第三种判断方式， 直接在路由配置时， 添加 meta 数据
    // 就可以在这里进行判断
    if(to.meta.auth){
        const token = localStorage.getItem('token');
        if(token){
          next();
        }else{
          router.push('/login')
        }
    }else{
        next();
    }
});


// 设置axios请求拦截器
axios.interceptors.request.use(config=>{
    // 判断是否有Authorization和token，如果两者都有则做用户验证
    if(!config.headers.Authorization && localStorage.getItem('token')){
        config.headers.Authorization = 'Bearer ' + localStorage.getItem('token');
    }
    return config;
})



// 设置响应拦截器 （统一处理响应回来的数据）
// axios.interceptors.response.use() 这个函数可以拦截到所有请求的响应，并执行逻辑
// 我们需要将逻辑函数作为参数传入
// 在入口文件，也就是组件外部，要使用 toast 需要单独引入
axios.interceptors.response.use(res=>{
    const {statusCode,message} = res.data;
    const {url} = res.config;//获取接口

    let urlArr = ['/login'];//这里的接口不走拦截器

    if(!urlArr.includes(url)){
        // 对用户信息验证失败情况进行处理
        if(statusCode && statusCode == 401 && message == '用户信息验证失败'){
            // 处理错误，在入口文件如果想要使用 vant ui 弹出窗口、
            // 这里没有 this 也没有 $toast
            // 可以使用单独引入的方式，只使用 Toast
            Toast.fail('用户信息验证失败，请重新登录');
            localStorage.removeItem('token');
            localStorage.removeItem('userId');
            router.replace('/login');
        }else if(statusCode && statusCode.toString().startsWith('4',0)){
            Toast.fail(message);
        }
    }
    return res;
  },(err)=>{
    // 暂不处理
    Toast.fail('请联系相关人员处理');
    console.log(err);
})

// 全局过滤器
Vue.filter('fixImgUrl',(url)=>{
    const reg = /^http/;
    if(reg.test(url)){
       return url;
    }else{
       return axios.defaults.baseURL + url;
    }
});
